package cl.portal.escolares.action;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cl.portal.escolares.DAO.DAOAlumno;
import cl.portal.escolares.DAO.DAOApoderado;
import cl.portal.escolares.DAO.DAOColegio;
import cl.portal.escolares.DAO.DAOFurgon;
import cl.portal.escolares.DAO.DAOPago;
import cl.portal.escolares.DAO.DAOUsuario;
import cl.portal.escolares.domain.Alumno;
import cl.portal.escolares.domain.Apoderado;
import cl.portal.escolares.domain.Colegio;
import cl.portal.escolares.domain.Curso;
import cl.portal.escolares.domain.FormaPago;
import cl.portal.escolares.domain.Furgon;
import cl.portal.escolares.domain.Pago;
import cl.portal.escolares.domain.Usuario;

import com.opensymphony.xwork2.ActionSupport;

public class ApoderadoSaveAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private static Log _log = LogFactory.getLog(ApoderadoSaveAction.class);

	private int existOrNew;
	private Apoderado apoderado;
	private Usuario usuario;
	private Long usuarioId;
	private List<Apoderado> apoderados;
	private List<Alumno> alumnos;
	private String fecha;
	private int[] diasPago = { 5, 10, 15, 20, 25, 30 };

	private String okMessage = "";
	private String errorMessage = "";
	private Integer pagosPendientes;
	private Integer pagosRealizados;
	private List<Furgon> furgones;
	private List<Colegio> colegios;
	private List<Curso> cursos;
	private HashMap<Long, String> furgonesMap;
	private HashMap<Long, Integer> alumnosMap;
	private HashMap<Long, Integer> pagosPendientesMap;
	private HashMap<Long, Integer> pagosRealizadosMap;

	public String execute() throws Exception {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date fechaActual = sdf.parse(sdf.format(new Date()));

			//
			// if (getUsuarioId() != null && getUsuarioId() > 0)
			// setUsuario(DAOUsuario.get(getUsuarioId()));
			// else
			setUsuario(DAOUsuario.get(apoderado.getUsuarioId()));

			if (getExistOrNew() == 1) {

				Apoderado objeto = DAOApoderado.get(apoderado.getApoderadoId());
				Long diaPago = objeto.getDiaPago();
				objeto.setRut(apoderado.getRut());
				objeto.setNombres(apoderado.getNombres());
				objeto.setApellidos(apoderado.getApellidos());
				objeto.setDireccion(apoderado.getDireccion());
				objeto.setContratoId(apoderado.getContratoId());
				objeto.setEmail(apoderado.getEmail());
				objeto.setTelefono(apoderado.getTelefono());
				objeto.setDiaPago(apoderado.getDiaPago());
				objeto.setUltimaModificacion(fechaActual);

				DAOApoderado.update(objeto);
				setApoderado(objeto);
				setAlumnos(DAOAlumno.list(usuario.getUsuarioId(),
						apoderado.getApoderadoId(), null, null, null, null,
						null, null, true));

				if (apoderado.getDiaPago() != diaPago) {
					// Actualizar le fecha de Pago de los pagos pendientes del
					// apoderado
					List<Pago> pagos = DAOPago.list(usuario.getUsuarioId(),
							null, apoderado.getApoderadoId(), null, null, null,
							false, null,true);
					Calendar cal = (Calendar.getInstance());
					for (Pago p : pagos) {
						cal.setTime(p.getFecha());
						cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(objeto
								.getDiaPago().toString()));
						p.setFecha(sdf.parse(sdf.format(cal.getTime())));
						DAOPago.update(p);
					}
				}

				setFurgones(DAOFurgon.list(getUsuarioId(), null, true));
				;
				setColegios(DAOColegio.list(true));
				setCursos(new ArrayList<Curso>());
				furgonesMap = new HashMap<Long, String>();
				for (Furgon f : furgones) {
					furgonesMap.put(f.getFurgonId(), f.getPatente());
				}
				pagosPendientesMap = new HashMap<Long, Integer>();
				pagosRealizadosMap = new HashMap<Long, Integer>();
				for (Alumno a : alumnos) {
					pagosPendientesMap.put(a.getAlumnoId(), (DAOPago.list(
							a.getUsuarioId(), a.getAlumnoId(),
							a.getApoderadoId(), null, null, null, false, null,true))
							.size());
					pagosRealizadosMap.put(a.getAlumnoId(), (DAOPago.list(
							a.getUsuarioId(), a.getAlumnoId(),
							a.getApoderadoId(), null, null, null, true, null,true))
							.size());
				}
				// crear metodos para obtener los totales pagados en dinero y
				// cantidad de pagos
				setPagosPendientes(0);
				setPagosRealizados(0);
				setOkMessage("Operacion realizada exitosamente.");
				setErrorMessage("");

				return "successExist";
			} else {

				Apoderado objeto = new Apoderado();
				objeto.setUsuarioId(usuario.getUsuarioId());
				objeto.setRut(apoderado.getRut());
				objeto.setNombres(apoderado.getNombres());
				objeto.setApellidos(apoderado.getApellidos());
				objeto.setDireccion(apoderado.getDireccion());
				objeto.setContratoId(apoderado.getContratoId());
				objeto.setEmail(apoderado.getEmail());
				objeto.setTelefono(apoderado.getTelefono());
				objeto.setDiaPago(apoderado.getDiaPago());
				objeto.setFechaCreacion(fechaActual);
				objeto.setUltimaModificacion(fechaActual);
				objeto.setActivo(true);
				DAOApoderado.add(objeto);

				setApoderados(DAOApoderado.list(usuario.getUsuarioId(), null,
						null, null, true));
				setApoderado(new Apoderado());
				alumnosMap = new HashMap<Long, Integer>();
				for (Apoderado a : apoderados)
					alumnosMap.put(a.getApoderadoId(), (DAOAlumno.list(
							usuario.getUsuarioId(), a.getApoderadoId(), null,
							null, null, null, null, null, true)).size());
				setOkMessage("Datos Guardados Satisfactoriamente.");
				setErrorMessage("");
				return "success";

			}
		} catch (Exception e) {
			_log.error(e);
			setErrorMessage("Se ha producido un error inesperado.");
			setOkMessage("");
			addActionError(getText("error.login"));
			return "error";
		}
	}

	public HashMap<Long, Integer> getPagosPendientesMap() {
		return pagosPendientesMap;
	}

	public void setPagosPendientesMap(HashMap<Long, Integer> pagosPendientesMap) {
		this.pagosPendientesMap = pagosPendientesMap;
	}

	public HashMap<Long, Integer> getPagosRealizadosMap() {
		return pagosRealizadosMap;
	}

	public void setPagosRealizadosMap(HashMap<Long, Integer> pagosRealizadosMap) {
		this.pagosRealizadosMap = pagosRealizadosMap;
	}

	public List<Furgon> getFurgones() {
		return furgones;
	}

	public void setFurgones(List<Furgon> furgones) {
		this.furgones = furgones;
	}

	public List<Colegio> getColegios() {
		return colegios;
	}

	public void setColegios(List<Colegio> colegios) {
		this.colegios = colegios;
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}

	public HashMap<Long, String> getFurgonesMap() {
		return furgonesMap;
	}

	public void setFurgonesMap(HashMap<Long, String> furgonesMap) {
		this.furgonesMap = furgonesMap;
	}

	public static Log get_log() {
		return _log;
	}

	public static void set_log(Log _log) {
		ApoderadoSaveAction._log = _log;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Apoderado getApoderado() {
		return apoderado;
	}

	public void setApoderado(Apoderado apoderado) {
		this.apoderado = apoderado;
	}

	public String getFecha() {
		return fecha;
	}

	public void setFecha(String fecha) {
		this.fecha = fecha;
	}

	public int getExistOrNew() {
		return existOrNew;
	}

	public void setExistOrNew(int existOrNew) {
		this.existOrNew = existOrNew;
	}

	public int[] getDiasPago() {
		return diasPago;
	}

	public void setDiasPago(int[] diasPago) {
		this.diasPago = diasPago;
	}

	public List<Apoderado> getApoderados() {
		return apoderados;
	}

	public void setApoderados(List<Apoderado> apoderados) {
		this.apoderados = apoderados;
	}

	public List<Alumno> getAlumnos() {
		return alumnos;
	}

	public void setAlumnos(List<Alumno> alumnos) {
		this.alumnos = alumnos;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Long getUsuarioId() {
		return usuarioId;
	}

	public void setUsuarioId(Long usuarioId) {
		this.usuarioId = usuarioId;
	}

	public String getOkMessage() {
		return okMessage;
	}

	public void setOkMessage(String okMessage) {
		this.okMessage = okMessage;
	}

	public String getErrorMessage() {
		return errorMessage;
	}

	public void setErrorMessage(String errorMessage) {
		this.errorMessage = errorMessage;
	}

	public Integer getPagosPendientes() {
		return pagosPendientes;
	}

	public void setPagosPendientes(Integer pagosPendientes) {
		this.pagosPendientes = pagosPendientes;
	}

	public Integer getPagosRealizados() {
		return pagosRealizados;
	}

	public void setPagosRealizados(Integer pagosRealizados) {
		this.pagosRealizados = pagosRealizados;
	}

	public HashMap<Long, Integer> getAlumnosMap() {
		return alumnosMap;
	}

	public void setAlumnosMap(HashMap<Long, Integer> alumnosMap) {
		this.alumnosMap = alumnosMap;
	}

}
